package bbalgae;



public class J21_AccesModifier {

	/* 캡슐화encapsulation와 접근제어
	 * OOP의 원칙에서 캡슐화는 객체의 일부를 보호하고 노출해도 상관없는 부분을 노출했을 때에는 안전해야 한다는 매커니즘.
	 * 
	 * 예를 들어, 텔리변은 캡슐화의 좋은 예임 
	 * 텔레비젼의 수많은 부품들은 금속커버 안에 놓아둠
	 * 클래스 개발자는 변수와 메소드들을 외부로 부터 숨기는게 좋다
	 * 
	 * 자바는 접근제어를 통해 캡슐화를 지원함
	 * 접근 제어의 종류에는 4가지가 존재
	 * public : 어디서나 접근가능함을 의미
	 * private : 자신만 접근 가능, 그외는 접근 불가
	 * protected : 상속관계의 클래스만 접근 가능
	 * default : 기본 패키지 내 클래스들끼리만 접근가능
	 * 
	 * 클래스에 적용 :public, defualt 만 사용가능
	 * ☆멤버변수 적용: public, protected, private, default
	 * 메소드적용: public, protected, private, default
	 * 
	 * 결론 
	 * OOP의 캡슐화 원칙에 따라 클래스의 멤버변수들은 무조건 private 선언
	 * 클래스의 메소드들은 노출할 경우 public 선언하고, 그외의 경우에는 protected로 선언
	 * 
	 * setXxx 메소드 작성법 
	 * 멤버변수명이 name 인경우 
	 * public void setName(String name){
	 *  this.name=name;}
	 * 	
	 * getXxx 메소드 작성법
	 * public String getName(){
	 * return this.name;}
	 * 
	 * 
	 */

	public static void main(String[] args) {
		
		//default 클래스 불러오기 실패 - default클래스에 선언된 클래스는 같은 패키지  내에서만 접근가능
		//즉 bbalgae 패키지에서 default패키지에 있는 클래스는 접근이 안됨.
		//J21_DefaultClass dfc = new J21_DefaultClass;
		//J21_PublicClass 클래스가 public 이라 허더라도 default 패키지 내에 있으므로 접근 불가
		//J21_PublicClass pbc = new J21_PublicClass();
		//J21_PublicClass클래스는 public이기때문에 어딘지도 접근 가능 default만 빼고 
		J21_PublicClass pbc = new J21_PublicClass();
		
		bbalgae.J21_PublicClass pbc1 = new J21_PublicClass();
		Ex1.J21_PublicClass pbc2 = new Ex1.J21_PublicClass();	
		///클래스 
		//같은 패키지내 클래스의 멤버변수 접근
		pbc1.defautval=1;
		pbc1.publicval=1;
		//pbc1.privateval=3; 자기 자신내 클래스만 사용 가능
		
		
		//다른 패키지내 클래스 멤버변수 접근
		pbc2.publicval=1;
		//pbc2.defaultva=4;
		//pbc2.privateval=4;
	
		//같은 패키지내 클래스의 메소드 접근 
		pbc1.publicmethod();
		pbc1.defualtmethod();
		//pbc1.privatemethod(); 
	
		//다른 패키지 클래스의 메소드 접근
		pbc2.publicmethod();
		//pbc2.defualtmethod=1;
		//pbc2.privatemethod=1; 
			
	}
}
